﻿#pragma once
#include <string>
#include <deque>
#include <memory>
// 参数指标数据
namespace MetData
{
	enum MetriceType : uint8_t
	{
		Metrice_Unknown,
		Metrice_MA,
		Metrice_MACD,
		Metrice_ATR,
		Metrice_Boll,
		Metrice_OVB,
		Metrice_Wave,
		Metrice_DividingLine
	};
	// 指标基础
	class MetriceBase : public std::enable_shared_from_this<MetriceBase>
	{
	public:
		MetriceBase() { m_type = Metrice_Unknown; }
		virtual ~MetriceBase(){}
		// 返回指标类型
		MetriceType GetType() { return m_type; }
		// 设置指标名称
		std::string Name; // 指标名称
		std::string Describe; // 指标的描述
	protected:
		MetriceType m_type;
	};
	// 均线
	class MAMetrice : public MetriceBase
	{
	public:
		MAMetrice() { m_type = Metrice_MA; }
		int StartIndex; // 相对于K线的相对位置
		int Mins; // 分钟
		std::deque<float> Line; // 线的数据
	};
	// MACD
	class MACDMeterice : public MetriceBase
	{
	public:
		MACDMeterice() { m_type = Metrice_MACD; }
		int StartIndex; // 相对于K线的起始索引
		std::deque<float> MACDPara; // 对应于DIF
		std::deque<float> MACDSignal; // 对应于dea
		std::deque<float> MACDHist; // 对应于macd
	};
	// 波动率指标
	class ATRMetrice : public MetriceBase
	{
	public:
		ATRMetrice() { m_type = Metrice_ATR; }
		int StartIndex; // 相对于K线的起始索引
		std::deque<float> Values; // 数据
	};
	// 布林带
	class BollMetrice : public MetriceBase
	{
	public:
		BollMetrice() { m_type = Metrice_Boll; }
		int StartIndex; // 相对于K线的起始索引
		std::deque<float> UpperBand; // 上轨数据
		std::deque<float> MiddleBand; // 中轨数据
		std::deque<float> LowerBand; // 下轨数据
	};
	class OVBMetrice : public MetriceBase
	{
	public:
		OVBMetrice() { m_type = Metrice_OVB; }
		int StartIndex; // 相对于K线的起始索引
		std::deque<float> Values; // 数据
	};
	// 波浪线
	class Wave : public MetriceBase
	{
	public:
		Wave() { m_type = Metrice_Wave; }
		std::deque<std::pair<int, float>> Values;
	};
	// 分割线
	class DividineLine : public MetriceBase
	{
	public:
		DividineLine(){ m_type = Metrice_DividingLine; }
		float Value;
	};
}

